<?php
/**
 * 控制器基类
 * @author Yangdong Zhang <zhangyangdong@gouuse.cn>
 * @time 2018/10/12 16:14
 */
namespace App\Controller;

use App\Util\Template;
use Firebase\JWT\JWT;

class Base
{

    public $assign = [];

    public $tokenInfo;

    /**
     * 构造函数
     * Base constructor.
     */
    public function __construct()
    {
        //构造函数
        if ($this->getCallClass() != 'Site' && $this->isAjax()) {
            //验证登录
            $jwtConfig = getConfig('jwt');
            $header = getallheaders();
            try {
                $tokenInfo = JWT::decode($header['Authorization'], $jwtConfig['key'], ['HS256']);
                $this->tokenInfo = $tokenInfo;
            }catch (\Exception $e) {
                exit(json_encode($this->error('请重新登录', 401)));
            }
        }
    }

    /**
     * 显示模板
     * @param string $tpl
     * @param string $suffix 模板后缀
     * @throws \ErrorException
     */
    public function display($tpl='', $suffix='html')
    {
        $file = Template::instance()->template($tpl, $this->getCallClass());
        if (is_file($file)) {
            extract($this->assign);
            require_once $file;
            return;
        }
        throw new \ErrorException($file. ' template file don\'t exists');
    }

    /**
     * 获取调用类名称
     * @return mixed
     */
    public function getCallClass()
    {
        $class = get_class($this);
        $class = explode('\\', $class);

        return end($class);
    }

    /**
     * 赋值
     * @param $key
     * @param $value
     */
    public function assign($key, $value)
    {
        $this->assign[$key] = $value;
    }

    /**
     * 设置值
     * @param $name
     * @param $value
     */
    public function __set($name, $value)
    {
        // TODO: Implement __set() method.
        $this->assign[$name] = $value;
    }

    /**
     * 是否是Post请求方法
     * @return bool
     */
    public function isPost()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            return true;
        }
        return false;
    }

    /**
     * 是否是ajax请求方法
     * @return bool
     */
    public function isAjax()
    {
        $header = getallheaders();
        if (isset($header['X-Requested-With'])) {
            return true;
        }
        return false;
    }

    /**
     * 成功返回
     * @param $msg
     * @param $data
     * @return array
     */
    public function success($msg='ok', $data=[])
    {
        return [
            'code' => 200,
            'msg'  => $msg,
            'data' => $data
        ];
    }

    /**
     * 失败返回
     * @param string $msg
     * @param string $code
     * @param array $data
     * @return array
     */
    public function error($msg='ok', $code='400', $data=[])
    {
        return [
            'code' => $code,
            'msg'  => $msg,
            'data' => $data
        ];
    }
}